// pages/mall/mall.js
const db = wx.cloud.database()
const _ = db.command

Page({
  data: {
    userPoints: 0, // 用户积分（从本地userinfo获取）
    goodsList: [], // 商品列表（标记是否已领取）
    loading: true, // 加载状态
    error: null // 错误信息
  },

  // 生命周期：页面加载时
  onLoad() {
    this.initPageData();
  },

  // 生命周期：页面显示时（每次切回页面都会触发）
  onShow() {
    this.initPageData();
  },

  // 初始化页面数据（整合获取积分和商品列表）
  initPageData() {
    this.getUserPointsFromLocal(); // 从本地获取用户积分
    this.getGoodsListWithStatus(); // 获取带领取状态的商品列表
  },

  // 从本地userinfo获取用户积分（关键修改点）
  getUserPointsFromLocal() {
    try {
      const userinfo = wx.getStorageSync('userInfo');
      if (!userinfo) {
        this.setData({ error: '请先登录', loading: false });
        return;
      }
      
      // 从本地userinfo中提取积分（假设userinfo包含points字段）
      this.setData({
        userPoints: userinfo.points || 0,
        error: null
      });
    } catch (err) {
      console.error('获取本地userinfo失败:', err);
      this.setData({
        error: '获取用户信息失败，请重试',
        loading: false
      });
    }
  },

  // 获取带领取状态的商品列表（优化查询逻辑）
  getGoodsListWithStatus() {
    this.setData({ loading: true });
    const userId = wx.getStorageSync('openid'); // 假设已登录用户有openid

    // 并行查询商品列表和用户已领取记录
    Promise.all([
      db.collection('goods').get(), // 获取所有可用商品
      db.collection('user_rewards').where({
        userId: userId,
        goodsId: _.exists(true) // 确保存在商品ID
      }).get() // 获取用户已领取记录
    ])
    .then(([goodsRes, receivedRes]) => {
      const allGoods = goodsRes.data;
      const receivedGoodsIds = receivedRes.data.map(item => item.goodsId);

      // 标记商品是否已领取（关键状态）
      const updatedGoods = allGoods.map(goods => ({
        ...goods,
        received: receivedGoodsIds.includes(goods._id) // 已领取标记
      }));

      this.setData({
        goodsList: updatedGoods,
        loading: false,
        error: null
      });
    })
    .catch(err => {
      console.error('获取商品列表失败:', err);
      this.setData({
        error: '加载商品失败，请重试',
        loading: false
      });
    });
  },

  // 领取商品（核心逻辑，不扣除积分但限制领取次数）
  exchangeGoods(e) {
    const goodsId = e.currentTarget.dataset.id;
    const targetGoods = this.data.goodsList.find(g => g._id === goodsId);

    if (!targetGoods) return;

    // 检查是否已领取
    if (targetGoods.received) {
      wx.showToast({ title: '已领取过该商品', icon: 'none' });
      return;
    }

    // 检查积分是否足够（使用本地userinfo的积分）
    if (this.data.userPoints < targetGoods.requiredPoints) {
      wx.showToast({ title: '积分不足，无法领取', icon: 'none' });
      return;
    }

    wx.showLoading({ title: '领取中...' });

    // 记录领取行为到数据库（关键防重复领取）
    db.collection('user_rewards').add({
      data: {
        userId: wx.getStorageSync('openid'), // 用户ID
        goodsId: goodsId, // 商品ID
        goodsName: targetGoods.name, // 商品名称（方便查询）
        receiveTime: db.serverDate() // 领取时间
      }
    })
    .then(() => {
      // 本地更新商品状态（避免重复请求）
      const updatedGoods = this.data.goodsList.map(goods => 
        goods._id === goodsId ? { ...goods, received: true } : goods
      );

      this.setData({ goodsList: updatedGoods });
      wx.showToast({ title: '领取成功', icon: 'success' });
    })
    .catch(err => {
      console.error('领取记录保存失败:', err);
      wx.showToast({ title: '领取失败，请重试', icon: 'none' });
    })
    .finally(() => {
      wx.hideLoading();
    });
  },

  // 下拉刷新
  onPullDownRefresh() {
    this.initPageData(); // 重新初始化数据
    wx.stopPullDownRefresh(); // 停止刷新动画
  },

  // 错误重试
  retry() {
    this.initPageData();
  }
});